package com.template.common.base;

import com.template.common.result.Result;
import com.template.common.util.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 基础控制器类
 * 
 * @author template
 * @since 2024-01-01
 */
public abstract class BaseController<T extends BaseEntity, S extends BaseService<T>> {

    @Autowired
    protected S baseService;

    /**
     * 分页查询
     * 
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 分页结果
     */
    @GetMapping("/page")
    public Result<PageUtil.PageResult<T>> page(@RequestParam(defaultValue = "1") Integer pageNum,
                                               @RequestParam(defaultValue = "10") Integer pageSize) {
        PageUtil.PageResult<T> result = baseService.page(pageNum, pageSize);
        return Result.success(result);
    }

    /**
     * 分页查询（带排序）
     * 
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param orderBy 排序字段
     * @param orderDirection 排序方向
     * @return 分页结果
     */
    @GetMapping("/page/order")
    public Result<PageUtil.PageResult<T>> pageWithOrder(@RequestParam(defaultValue = "1") Integer pageNum,
                                                        @RequestParam(defaultValue = "10") Integer pageSize,
                                                        @RequestParam(required = false) String orderBy,
                                                        @RequestParam(required = false) String orderDirection) {
        PageUtil.PageResult<T> result = baseService.page(pageNum, pageSize, orderBy, orderDirection);
        return Result.success(result);
    }

    /**
     * 根据ID查询
     * 
     * @param id ID
     * @return 实体
     */
    @GetMapping("/{id}")
    public Result<T> getById(@PathVariable Long id) {
        T entity = baseService.getById(id);
        if (entity == null) {
            return Result.error("数据不存在");
        }
        return Result.success(entity);
    }

    /**
     * 查询列表
     * 
     * @return 列表
     */
    @GetMapping("/list")
    public Result<List<T>> list() {
        List<T> list = baseService.list();
        return Result.success(list);
    }

    /**
     * 新增
     * 
     * @param entity 实体
     * @return 是否成功
     */
    @PostMapping
    public Result<Boolean> save(@RequestBody T entity) {
        boolean result = baseService.save(entity);
        return result ? Result.success(true) : Result.error("保存失败");
    }

    /**
     * 修改
     * 
     * @param entity 实体
     * @return 是否成功
     */
    @PutMapping
    public Result<Boolean> update(@RequestBody T entity) {
        if (entity.getId() == null) {
            return Result.error("ID不能为空");
        }
        boolean result = baseService.updateById(entity);
        return result ? Result.success(true) : Result.error("更新失败");
    }

    /**
     * 根据ID删除
     * 
     * @param id ID
     * @return 是否成功
     */
    @DeleteMapping("/{id}")
    public Result<Boolean> removeById(@PathVariable Long id) {
        boolean result = baseService.removeById(id);
        return result ? Result.success(true) : Result.error("删除失败");
    }

    /**
     * 批量删除
     * 
     * @param ids ID列表
     * @return 是否成功
     */
    @DeleteMapping("/batch")
    public Result<Boolean> removeByIds(@RequestBody List<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            return Result.error("ID列表不能为空");
        }
        boolean result = baseService.removeByIds(ids);
        return result ? Result.success(true) : Result.error("批量删除失败");
    }

    /**
     * 根据ID判断是否存在
     * 
     * @param id ID
     * @return 是否存在
     */
    @GetMapping("/exists/{id}")
    public Result<Boolean> existsById(@PathVariable Long id) {
        boolean exists = baseService.existsById(id);
        return Result.success(exists);
    }

    /**
     * 统计数量
     * 
     * @return 数量
     */
    @GetMapping("/count")
    public Result<Long> count() {
        long count = baseService.count();
        return Result.success(count);
    }
}
